parser grammar AnalizadorCParser;

options {
  language = Java;
  tokenVocab = AnalizadorCLexer;
}


@header {package PL.practica6;}



@members{

ArrayList <RecognitionException> errores = new ArrayList<RecognitionException>();

public boolean listaVacia (){
    if (errores.isEmpty()){
      return true;
    }else
      return false;
}

public ArrayList getListaErrores(){return errores;}


@Override
public void reportError (RecognitionException e){
  System.out.println (getErrorMessage(e, getTokenNames()));
  errores.add(e);
}

}


entrada : metodo ;


ifWhile : (IF | WHILE) ABRIRPARENTESIS condiciones CERRARPARENTESIS (bloque| bloqueLlaves);
  condicion :  (EXCLAMACION IDENT) | (operacion ((ANGULOS IGUAL?)| DISTINTO | IGUAL) operacion);
  condiciones :  condicion (OPERADORLOGICOS condicion)*;
  operacion : parametros ((OPERADORUNITARIOS |ASTERISCO) (IDENT| NUMERO))*;
  metodo : cabecerafuncion  bloqueLlaves;
  bloque : (ifWhile | condicionalaritmetico | ((asignacion|printf|llamadafuncion|declaracion |BREAK) SEPARADOR));
  bloqueLlaves : ABRIRLLAVE  (ifWhile | condicionalaritmetico | ((asignacion|printf|llamadafuncion|declaracion |BREAK)SEPARADOR))* ret? CERRARLLAVE;
    vector : (ASTERISCO? IDENT CORCHETES*);
    parametros : vector | CADENA |NUMERO |CARACTER ; 
    cabecerafuncion : (TIPO | VOID) IDENT ABRIRPARENTESIS ((VOID |TIPO IDENT) (COMA TIPO parametros)*)? CERRARPARENTESIS;
    llamadafuncion : IDENT ABRIRPARENTESIS ( parametros (COMA parametros)*)? CERRARPARENTESIS;
    printf :  PRINTF ABRIRPARENTESIS CADENA (COMA IDENT)* CERRARPARENTESIS ;
    asignacion : IDENT IGUAL (operacion | llamadafuncion);
    declaracion : TIPO IDENT (COMA IDENT)*;
    ret : RETORNAR (NUMERO|IDENT|CADENA)? SEPARADOR;
    condicionalaritmetico: condicion INTERROGANTE NUMERO DOSPUNTOS NUMERO SEPARADOR; 
  